package Model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;

@Entity
@Table(name = "empresa")
@SuppressWarnings("serial")
public class Empresa implements Serializable {

   @Id
   @SequenceGenerator(name = "cod_empresa", sequenceName = "cod_empresa_seq", allocationSize = 1)
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_empresa")
   @Column(name = "cod_empresa", nullable = false)
   private int codEmpresa;

   @ManyToOne(fetch = FetchType.EAGER, cascade = {javax.persistence.CascadeType.MERGE})
   @JoinColumn(name = "cod_endereco")
   @Fetch(FetchMode.SELECT)
   @Cascade({CascadeType.LOCK, CascadeType.EVICT})
   private Endereco endereco;

   @Column(name = "nome")
   private String nome;

   @Column(name = "razao_social")
   private String razaoSocial;

   @Column(name = "cnpj")
   private String cnpj;

   @Column(name = "insc_estadual")
   private String inscEstadual;

   @Column(name = "telefone")
   private String telefone;

   @Column(name = "telefone_fax")
   private String telefoneFax;

   @Column(name = "email")
   private String email;

   @Column(name = "ativo")
   private boolean ativo;

   @OneToMany(mappedBy = "empresa", fetch = FetchType.LAZY)
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   private Collection<Motorista> motorista;

   @OneToMany(mappedBy = "empresa", fetch = FetchType.LAZY)
   @Fetch(FetchMode.SELECT)
   private Collection<Caminhao> caminhao;
   
   @OneToMany(mappedBy = "empresa", fetch = FetchType.LAZY)
   @Fetch(FetchMode.SELECT)
   private Collection<Carreta> carreta;


   @OneToMany(mappedBy = "empresa", fetch = FetchType.EAGER, cascade = {javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.REMOVE, javax.persistence.CascadeType.PERSIST})
   @Cascade(CascadeType.LOCK)
   @Fetch(FetchMode.SELECT)
   private Collection<PedidoEmpresaVO> pedidoEmpresa;

   //consturtor padrao
   public Empresa() {
      pedidoEmpresa = new ArrayList<PedidoEmpresaVO>();
   }
   //contrutor com parametros

   public Empresa(int codEmpresa, Endereco endereco, String nome, String razaoSocial,
           String cnpj, String inscEstadual, String telefone, String telefoneFax, String email, boolean ativo) {
      this.codEmpresa = codEmpresa;
      this.endereco = endereco;
      this.nome = nome;
      this.razaoSocial = razaoSocial;
      this.cnpj = cnpj;
      this.inscEstadual = inscEstadual;
      this.telefone = telefone;
      this.telefoneFax = telefoneFax;
      this.email = email;
      this.ativo = ativo;
   }

   //Metodos Get e Set
   public int getCodEmpresa() {
      return codEmpresa;
   }

   public void setCodEmpresa(int codEmpresa) {
      this.codEmpresa = codEmpresa;
   }

   public Endereco getEndereco() {
      return endereco;
   }

   public void setEndereco(Endereco endereco) {
      this.endereco = endereco;
   }

   public String getNome() {
      return nome;
   }

   public void setNome(String nome) {
      this.nome = nome;
   }

   public String getCnpj() {
      return cnpj;
   }

   public void setCnpj(String cnpj) {
      this.cnpj = cnpj;
   }

   public String getInscEstadual() {
      return inscEstadual;
   }

   public void setInscEstadual(String inscEstadual) {
      this.inscEstadual = inscEstadual;
   }

   public String getTelefone() {
      return telefone;
   }

   public void setTelefone(String telefone) {
      this.telefone = telefone;
   }

   public String getTelefoneFax() {
      return telefoneFax;
   }

   public void setTelefoneFax(String telefoneFax) {
      this.telefoneFax = telefoneFax;
   }

   public boolean getAtivo() {
      return ativo;
   }

   public void setAtivo(boolean ativo) {
      this.ativo = ativo;
   }

   public Collection<Motorista> getMotorista() {
      return motorista;
   }

   public void setMotorista(Collection<Motorista> motorista) {
      this.motorista = motorista;
   }

   public Collection<Caminhao> getCaminhao() {
      return caminhao;
   }

   public void setCaminhao(Collection<Caminhao> caminhao) {
      this.caminhao = caminhao;
   }

   public String getEmail() {
      return email;
   }

   public void setEmail(String email) {
      this.email = email;
   }

   public String getRazaoSocial() {
      return razaoSocial;
   }

   public void setRazaoSocial(String razaoSocial) {
      this.razaoSocial = razaoSocial;
   }

   public Collection<PedidoEmpresaVO> getPedidoEmpresa() {
      return pedidoEmpresa;
   }

   public void setPedidoEmpresa(Collection<PedidoEmpresaVO> pedidoEmpresa) {
      this.pedidoEmpresa = pedidoEmpresa;
   }
   @Transient
   private double valorPedidos;

   public void setValorPedidos(double valorPedidos) {
      this.valorPedidos = valorPedidos;
   }


   public Collection<Carreta> getCarreta() {
      return carreta;
   }

   public void setCarreta(Collection<Carreta> carreta) {
      this.carreta = carreta;
   }

   
}
